#ifndef _WX_GTK_MDI_H_
#define _WX_GTK_MDI_H_

#include "wx/frame.h"

//-----------------------------------------------------------------------------
// wxMDIParentFrame
//-----------------------------------------------------------------------------

class wxMDIParentFrame: public wxFrame {
  public:
    wxMDIParentFrame() { Init(); }
    wxMDIParentFrame( wxWindow *parent,
                      wxWindowID id,
                      const wxString& title,
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& size = wxDefaultSize,
                      long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
                      const wxString& name = wxFrameNameStr ) {
      Init();
      ( void )Create( parent, id, title, pos, size, style, name );
    }

    virtual ~wxMDIParentFrame();
    bool Create( wxWindow *parent,
                 wxWindowID id,
                 const wxString& title,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
                 const wxString& name = wxFrameNameStr );

    wxMDIChildFrame *GetActiveChild() const;

    wxMDIClientWindow *GetClientWindow() const;
    virtual wxMDIClientWindow *OnCreateClient();

    virtual void Cascade() {}
    virtual void Tile( wxOrientation orient = wxHORIZONTAL ) {}
    virtual void ArrangeIcons() {}
    virtual void ActivateNext();
    virtual void ActivatePrevious();

    // implementation

    wxMDIClientWindow  *m_clientWindow;
    bool                m_justInserted;

    virtual void GtkOnSize();
    virtual void OnInternalIdle();

  protected:
    void Init();

  private:
    friend class wxMDIChildFrame;

    DECLARE_DYNAMIC_CLASS( wxMDIParentFrame )
};

//-----------------------------------------------------------------------------
// wxMDIChildFrame
//-----------------------------------------------------------------------------

class wxMDIChildFrame: public wxFrame {
  public:
    wxMDIChildFrame();
    wxMDIChildFrame( wxMDIParentFrame *parent,
                     wxWindowID id,
                     const wxString& title,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = wxDEFAULT_FRAME_STYLE,
                     const wxString& name = wxFrameNameStr );

    virtual ~wxMDIChildFrame();
    bool Create( wxMDIParentFrame *parent,
                 wxWindowID id,
                 const wxString& title,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxDEFAULT_FRAME_STYLE,
                 const wxString& name = wxFrameNameStr );

    virtual void SetMenuBar( wxMenuBar *menu_bar );
    virtual wxMenuBar *GetMenuBar() const;

    virtual void AddChild( wxWindowBase *child );

    virtual void Activate();

    #if wxUSE_STATUSBAR
    // no status bars
    virtual wxStatusBar* CreateStatusBar( int ( number ) = 1, long ( style ) = 1, wxWindowID( id ) = 1,
                                          const wxString&  name  = wxEmptyString ) {
      return ( wxStatusBar* )NULL;
    }

    virtual wxStatusBar *GetStatusBar() const { return ( wxStatusBar* )NULL; }
    virtual void SetStatusText( const wxString &( text ), int ( number ) = 0 ) {}
    virtual void SetStatusWidths( int ( n ), const int widths_field[] ) {}
    #endif

    // no size hints
    virtual void DoSetSizeHints( int minW, int minH, int maxW = wxDefaultCoord,int maxH = wxDefaultCoord,
                                 int incW = wxDefaultCoord,int incH = wxDefaultCoord ) {}

    #if wxUSE_TOOLBAR
    // no toolbar
    virtual wxToolBar* CreateToolBar( long ( style ),wxWindowID ( id ),const wxString& ( name ) ) {
     return ( wxToolBar* )NULL; }
    virtual wxToolBar *GetToolBar() const { return ( wxToolBar* )NULL; }
    #endif // wxUSE_TOOLBAR

    // no icon
    virtual void SetIcon( const wxIcon& icon ) { wxTopLevelWindowBase::SetIcon( icon ); }
    virtual void SetIcons( const wxIconBundle& icons ) { wxTopLevelWindowBase::SetIcons( icons ); }
    virtual void SetTitle( const wxString &title );
    virtual void Maximize( bool ( maximize ) = true ) { }
    virtual bool IsMaximized() const { return true; }
    virtual void Iconize( bool ( iconize ) = true ) { }
    virtual bool IsIconized() const { return false; }
    virtual void Restore() {}
    virtual bool IsTopLevel() const { return false; }
    virtual bool Destroy();
    void OnActivate( wxActivateEvent& event );
    void OnMenuHighlight( wxMenuEvent& event );
    wxMenuBar         *m_menuBar;
    GtkNotebookPage   *m_page;
    bool               m_justInserted;
  protected:
    virtual void DoSetSize( int x, int y,int width, int height,int sizeFlags = wxSIZE_AUTO );
    virtual void DoSetClientSize( int width, int height );
    virtual void DoGetClientSize( int *width, int *height ) const;

  private:
    DECLARE_EVENT_TABLE()
    DECLARE_DYNAMIC_CLASS( wxMDIChildFrame )
};

class wxMDIClientWindow: public wxWindow {
  public:
    wxMDIClientWindow();
    wxMDIClientWindow( wxMDIParentFrame *parent, long style = 0 );
    virtual ~wxMDIClientWindow();
    virtual bool CreateClient( wxMDIParentFrame *parent, long style = wxVSCROLL | wxHSCROLL );

  private:
    DECLARE_DYNAMIC_CLASS( wxMDIClientWindow )
};

#endif // _WX_GTK_MDI_H_
